﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace BusinessLogic
{
    public class Sistema
    {
        #region SINGLETON

        private static Sistema _UnSistema;
        public static Sistema getInstancia()
        {
            if(_UnSistema == null)
            {
                _UnSistema = new Sistema();
            }
            return _UnSistema;
        }

        #endregion

        #region CONSTRUCTORES
        private Sistema() { }
        #endregion

        #region METODOS


        //Verificar funcionario y su rol en el login.
        public Persona verifRolFuncionario(long pNro, string pPass)
        {
            return Persona.verificarFuncionario(pNro, pPass);
        }

        //Dar Usuario por Nro.
        public Usuario getUsuarioByNro(long pNro)
        {
            return Usuario.getUsuarioByNro(pNro);
        }

        //Dar funcionario especifico por su Nro de funcionario.
        public Persona getFuncEspecificoByNro(long pNro)
        {
            return Persona.getFuncionarioEspecificoByNro(pNro);
        }

        //Dar instancia de Clase por Rol.
        public Persona getTipoFuncByRol(string pRol)
        {
            //Genera y devuelve una instancia de una clase especifica de funcionario por su Rol, dentro de una instancia de persona.
            Persona p = null;

            if(pRol == "Supervisor")
            {
                p = new Supervisor();
            }
            else if(pRol == "Tecnico")
            {
                p = new Tecnico();
            }
            else if(pRol == "Usuario")
            {
                p = new Usuario();
            }
            else if(pRol == "Administrador")
            {
                p = new Tecnico();
            }
            //Se retorna la instancia creada.
            return p;
        }

        //Dar lista de funcionarios por estado. Devuelve una lista total de funcionarios dependiendo de su estado,
        //añadiendo tambien un campo en el que se especifica su rol.(THD Escritorio).
        public DataTable getListFuncByEstado(bool pEstado)
        {
            return Persona.getListFuncByEstado(pEstado);
        }

        //--------------SOLICITUDES---------------------------------

        
        //Dar solicitudes asignadas a un tecnico.
        public DataTable getSolicitudesAsignadas()
        {
            return Solicitud.getSolicitudesByAsigTec(true);
        }

        //Dar solicitudes NO asignadas a ningun tecnico.
        public DataTable getSolicitudesSinAsignar()
        {
            return Solicitud.getSolicitudesByAsigTec(false);
        }

        //Dar solicitudes por numero de Tecnico.
        public DataTable getSolicitudesByNroTec(long pNro)
        {
            return Solicitud.getSolicitudesByNroTecnico(pNro);
        }

        //Dar solicitudes ABIERTAS por numero de usuario.
        public DataTable getSolicitudesAbiertasByNroUsu(long pNro)
        {
            return Solicitud.getSolicitudesByNroUsuAndEstado(pNro, "Abierto");
        }

        //Dar solicitudes CERRADAS o CANCELADAS por numero de usuario.
        public DataTable getSolicitudesCerrOrCancByNroUsu(long pNro)
        {
            return Solicitud.getSolicitudesByNroUsuAndEstado(pNro, "Cerrado o Cancelado");
        }

        //Dar solicitud por numero.
        public Solicitud getSolicitudByNro(long pNro)
        {
            return Solicitud.getSolicitudByNro(pNro);
        }

        //Cambiar estado a una solicitud.
        public void setEstadoSolicitud(enEstado pEstado, long pSolNro)
        {
            Solicitud.cambiarEstado(pEstado, pSolNro);
        }

        //Asignar un tecnico a una solicitud.
        public void setTecnicoToSolicitud(long pTec, long pSol)
        {
            Solicitud.asignarTecnico(pTec, pSol);
        }

        //Dar lista de tecnicos y cantidad de solicitudes asignadas a cada uno.
        public DataTable getTecListAndCantSol()
        {
            return Tecnico.getTecnicosAndTickets();
        }

        //Dar lista de solicitudes asignadas por Nro de tecnico.
        public DataTable getSolAsigListByNroTec(long pNro)
        {
            return Solicitud.getSolByTecAndAsig(pNro);
        }

        //listar solicitudes ingresadas por mes y anio ( webservice)
        public List<string> getSolicitudesByAnio()
        {
            return Solicitud.getSolByMesAndAnio();
        }

        //------------------MENSAJES-----------------------
        //Dar lista de mensajes por numero de solicitud.
        public List<Mensaje> getMensajesByNroSolicitud(long pNroSol)
        {
            return Mensaje.getMensajesByNroSolicitud(pNroSol);
        }


        #endregion

    }
}
